package cn.it.shop.wechat.common;

import java.security.MessageDigest;
import java.util.Formatter;
import java.util.HashMap;
import java.util.UUID;

import cn.it.shop.util.GlobalConstants;

/**
 * ClassName: JSSDK_Config
 * @Description: 用户微信前端页面的 jssdk 配置使用
 * <br/>
 * 根据【JS-SDK使用权限签名算法】对参数进行签名得到signature，<br/>
 * 这里的url必须采用前端传递到后端，因为每次的url会有所变化
 * 
 * @author fys
 */
public class JSSDK_Config {

    /**
     * @Description: 前端 jssdk 页面配置需要用到的配置参数
     * @param @return hashmap {appid,timestamp,nonceStr,signature}
     * @param @throws Exception   
     */
    public static HashMap<String, String> jsSDK_Sign(String url) throws Exception {
        String nonce_str = create_nonce_str();//生成签名的随机串
        String timestamp= Long.toString(System.currentTimeMillis()/1000);//时间戳
        String jsapi_ticket=GlobalConstants.getInterfaceUrl("jsapi_ticket");
        // 注意这里参数名必须全部小写，且必须有序
        String  string1 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str
                + "&timestamp=" + timestamp  + "&url=" + url;
        MessageDigest crypt = MessageDigest.getInstance("SHA-1");
        crypt.reset();
        crypt.update(string1.getBytes("UTF-8"));
        String signature = byteToHex(crypt.digest());
        HashMap<String, String> jssdk=new HashMap<String, String>();
        jssdk.put("appId", GlobalConstants.getInterfaceUrl("appid"));
        jssdk.put("timestamp", timestamp);
        jssdk.put("nonceStr", nonce_str);//生成签名的随机串
        jssdk.put("signature", signature);//签名
        return jssdk;
    }
    
    /***
     * 加密算法
     * @param hash
     * @return
     */
    private static String byteToHex(final byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash) {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }
    
    /**
     * nonceStr 生成签名的随机串
     * @return
     */
    private static String create_nonce_str() {
        return UUID.randomUUID().toString();
    }

}
